package pe.com.bbva.pct.dao.impl;

import java.util.ArrayList;
import java.util.List;

import javax.persistence.Query;

import org.springframework.stereotype.Repository;

import pe.com.bbva.pct.dao.FuenteDAO;
import pe.com.bbva.pct.domain.Aplicacion;
import pe.com.bbva.pct.domain.Fuente;
import pe.com.bbva.pct.util.ConstantesGenerales;
import pe.com.bbva.pct.vo.AplicacionVO;
import pe.com.bbva.pct.vo.FuenteVO;

@Repository("fuenteDao")
public class FuenteDAOImpl extends GeneralDAOImpl<Fuente> implements FuenteDAO {

	@SuppressWarnings("unchecked")
	@Override
	public int cantidadTotalValores(FuenteVO fuenteVO)throws Exception{
		int cantidad=0;
		List<Fuente> listaFuentes =new ArrayList<Fuente>(); 
		try {

				StringBuilder queryString = new StringBuilder();
				queryString.append("SELECT p FROM Fuente p WHERE 1 = 1  AND p.idEstado.idValor <> " + ConstantesGenerales.VALOR_ELIMINADO );
				
				if (fuenteVO.getNombre()!=null && !fuenteVO.getNombre().trim().toUpperCase().equals("")) {
					queryString.append(" AND UPPER(p.nombre) like :pNombre ");
				}
				if (fuenteVO.getIdTipoFuente()!=null && !fuenteVO.getIdTipoFuente().equals("0")) {
					queryString.append(" AND p.idTipoFuente.idValor = :pIdTipoFuente ");
				}	
				
				if (fuenteVO.getIdEntradaSalida()!=null && !fuenteVO.getIdEntradaSalida().equals("0")) {
					queryString.append(" AND p.idEntradaSalida.idValor = :pIdEntradaSalida");
				}
				
				queryString.append(" ORDER BY p.idFuente ASC ");
				
				Query query = em.createQuery(queryString.toString());
				
				if (fuenteVO.getNombre()!=null && !fuenteVO.getNombre().trim().toUpperCase().equals("")) {
					query.setParameter("pNombre", "%"+fuenteVO.getNombre().toUpperCase().trim()+"%");
				}
				if (fuenteVO.getIdTipoFuente()!=null && !fuenteVO.getIdTipoFuente().equals("0")) {
					query.setParameter("pIdTipoFuente", Long.parseLong(fuenteVO.getIdTipoFuente()));
				}	
				if (fuenteVO.getIdEntradaSalida()!=null && !fuenteVO.getIdEntradaSalida().equals("0")) {
					query.setParameter("pIdEntradaSalida", Long.parseLong(fuenteVO.getIdEntradaSalida()));
				}
				
				
				listaFuentes= query.getResultList();	
				cantidad=listaFuentes.size();
		} catch (Exception e) {
			e.printStackTrace();
		}
		return cantidad;
	}
	
	
	@SuppressWarnings("unchecked")
	@Override
	public List<Fuente> obtenerValoresPaginado(int first, int pageSize, FuenteVO fuenteVO) throws Exception{
		List<Fuente> listaFuentes =new ArrayList<Fuente>(); 
		try {

			StringBuilder queryString = new StringBuilder();
			queryString.append("SELECT p FROM Fuente p WHERE 1 = 1 AND p.idEstado.idValor <> " + ConstantesGenerales.VALOR_ELIMINADO );
			
			if (fuenteVO.getNombre()!=null && !fuenteVO.getNombre().trim().toUpperCase().equals("")) {
				queryString.append(" AND UPPER(p.nombre) like :pNombre ");
			}
			if (fuenteVO.getIdTipoFuente()!=null && !fuenteVO.getIdTipoFuente().equals("0")) {
				queryString.append(" AND p.idTipoFuente.idValor = :pIdTipoFuente ");
			}	
			
			if (fuenteVO.getIdEntradaSalida()!=null && !fuenteVO.getIdEntradaSalida().equals("0")) {
				queryString.append(" AND p.idEntradaSalida.idValor = :pIdEntradaSalida");
			}
			
			queryString.append(" ORDER BY p.idFuente ASC ");
			
			Query query = em.createQuery(queryString.toString());
			
			if (fuenteVO.getNombre()!=null && !fuenteVO.getNombre().trim().toUpperCase().equals("")) {
				query.setParameter("pNombre", "%"+fuenteVO.getNombre().toUpperCase().trim()+"%");
			}
			if (fuenteVO.getIdTipoFuente()!=null && !fuenteVO.getIdTipoFuente().equals("0")) {
				query.setParameter("pIdTipoFuente", Long.parseLong(fuenteVO.getIdTipoFuente()));
			}	
			if (fuenteVO.getIdEntradaSalida()!=null && !fuenteVO.getIdEntradaSalida().equals("0")) {
				query.setParameter("pIdEntradaSalida", Long.parseLong(fuenteVO.getIdEntradaSalida()));
			}

		query.setFirstResult(first);
		query.setMaxResults(pageSize);
		listaFuentes = query.getResultList();
		
		} catch (Exception e) {
			e.printStackTrace();
		}
		return listaFuentes;
			
	}
	
	
	public List<Fuente> listarFuentes(Long tipo) throws Exception{
		List<Fuente> listaFuentes =new ArrayList<Fuente>(); 
		try {
			
			StringBuilder queryString = new StringBuilder();
			queryString.append("SELECT p FROM Fuente p WHERE 1 = 1 AND idEntradaSalida.idValor = "+tipo+" AND p.idEstado.idValor <> " + ConstantesGenerales.VALOR_ELIMINADO );
			queryString.append(" ORDER BY p.idFuente ASC ");
			Query query = em.createQuery(queryString.toString());

			listaFuentes = query.getResultList();
			
		} catch (Exception e) {
			e.printStackTrace();
		}
		return listaFuentes;
	}
}
